﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using _11_01_Binding.ViewModel;

namespace _11_01_Binding
{
	/// <summary>
	/// Interaction logic for MainWindow.xaml
	/// </summary>
	public partial class MainWindow : Window
	{
		//有三种常用的方式来指定绑定的源：ElementName、Source和RelativeSource。

		//ElementName：使用ElementName可以将绑定目标与指定的元素进行绑定。你需要在XAML中为目标元素指定一个Name属性，
		//然后在绑定中使用ElementName来引用该元素。例如：
		//<TextBox x:Name="myTextBox" Text="{Binding Path=Text, ElementName=myOtherTextBox}" />
		//在这个例子中，TextBox的Text属性与另一个名为myOtherTextBox的TextBox的Text属性进行绑定

		//Source：使用Source可以直接指定一个对象作为绑定的源。你可以在XAML中指定一个静态资源或者在代码中创建一个对象，
		//并将其作为绑定的Source。例如：
		//<TextBox Text = "{Binding path= MyText, Source={StaticResource myViewModel}}" />	在最上面自己定义的Window.Resource,或者资源字典	
		//在这个例子中，TextBox的Text属性与名为myViewModel的静态资源对象的MyText属性进行绑定

		//RelativeSource：使用RelativeSource可以指定一个相对于绑定目标的元素作为绑定的源。
		//你可以使用RelativeSource的Mode属性来指定相对关系，例如FindAncestor、Self、PreviousData等。例如：
		//<ItemsControl ItemsSource = "{Binding Items}" >       
		//	< ItemsControl.ItemTemplate >        
		//		< DataTemplate >        
		//			< TextBox Text="{Binding DataContext.MyText, RelativeSource={RelativeSource AncestorType=ItemsControl}}" />
		//		</DataTemplate>
		//	</ItemsControl.ItemTemplate>
		//</ItemsControl>
		//在这个例子中，TextBox的Text属性与ItemsControl的DataContext的MyText属性进行绑定。
		//RelativeSource的AncestorType属性指定了要查找的祖先元素的类型。

		//ElementName用于与指定的元素进行绑定，
		//Source用于直接指定一个对象作为绑定的源，
		//RelativeSource用于指定一个相对于绑定目标的元素作为绑定的源。


		//RelativeSource是用于在数据绑定中指定一个相对于绑定目标的元素作为绑定的源的属性。RelativeSource有几个常用的属性用法：

		//AncestorType：使用AncestorType属性可以指定要查找的祖先元素的类型。例如：
		//<TextBox Text = "{Binding DataContext.MyText, RelativeSource={RelativeSource AncestorType=ItemsControl}}" />
		//在这个例子中，TextBox的Text属性与ItemsControl的DataContext的MyText属性进行绑定。RelativeSource的AncestorType属性指定了要查找的祖先元素的类型。

		//AncestorLevel：使用AncestorLevel属性可以指定要查找的祖先元素的层级。例如：
		//<TextBox Text = "{Binding DataContext.MyText, RelativeSource={RelativeSource AncestorLevel=2}}" />
		//在这个例子中，TextBox的Text属性与绑定目标的祖先元素的祖先元素的DataContext的MyText属性进行绑定。RelativeSource的AncestorLevel属性指定了要查找的祖先元素的层级。

		//Mode：使用Mode属性可以指定相对关系的模式。常见的模式有以下几种：
		//FindAncestor：指定要查找的祖先元素的类型或者层级。
		//Self：指定绑定目标元素自身作为绑定的源。
		//PreviousData：指定绑定目标元素的上一个数据项作为绑定的源。通常在ItemsControl中使用。
		//TemplatedParent：指定绑定目标元素的模板父元素作为绑定的源。通常在控件模板中使用。

		//例如：
		//<TextBox Text = "{Binding Path=MyText, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" />
		//在这个例子中，TextBox的Text属性与Window的MyText属性进行绑定。RelativeSource的Mode属性设置为FindAncestor，AncestorType属性设置为Window，表示要查找的祖先元素是Window类型。

		//总结一下，RelativeSource是用于指定一个相对于绑定目标的元素作为绑定的源的属性。
		//通过AncestorType属性可以指定要查找的祖先元素的类型，通过AncestorLevel属性可以指定要查找的祖先元素的层级，
		//通过Mode属性可以指定相对关系的模式。根据具体的需求，选择合适的属性用法来指定绑定的源。

		//一般必须指定
		//x:Static：x:Static是一个MarkupExtension，用于在XAML中引用静态成员或静态属性。它可以用于绑定的Source属性，以指定静态成员或属性作为绑定的源。
		//x:Type：x:Type是一个MarkupExtension，用于在XAML中引用类型。它可以用于绑定的Source属性，以指定类型作为绑定的源,指的是父级控件，window,treeview等
		//x:Reference：x:Reference是一个MarkupExtension，用于在XAML中引用其他元素。它可以用于绑定的ElementName属性，以指定其他元素作为绑定的源。
		//x:Null：x:Null是一个MarkupExtension，用于在XAML中表示空值。它可以用于绑定的FallbackValue属性，以指定当绑定无法解析时使用的默认值。

		//x:Reference和ElementName都可以用于在XAML中引用其他元素，并在绑定中使用这些元素的属性。x:Reference适用范围更广，
		//可以在同一个XAML文件中引用任何其他元素，而ElementName只能在同一个控件内部引用其他元素。使用方式也略有不同，
		 //x:Reference是一个MarkupExtension，可以直接在绑定表达式中使用，而ElementName需要在绑定表达式中使用ElementName=来引用其他元素
		public MainWindow()
		{
			InitializeComponent();
			//this.DataContext = new MainViewModel();
		}

		private void Window_Loaded(object sender, RoutedEventArgs e)
		{
			//var binding = new Binding
			//{
			//	Path = new PropertyPath("Message"),
			//	Mode = BindingMode.TwoWay,

			//};
			//BindingOperations.SetBinding(Textblock1,TextBlock.TextProperty,binding);

		}

		private void Button_Click(object sender, RoutedEventArgs e)
		{
			//StaticMessage
		}
	}
}
